package connect;

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Properties;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.JTextPane;
import javax.swing.SwingConstants;
import javax.swing.border.EmptyBorder;

import lamps.Lamps;
import util.Util;


public class Connect extends JFrame {
	//序列号
	private static final long serialVersionUID = 1L;
	//连接面板
	private JPanel contentPane;
	//路灯id输入框
	private JTextField textField;
	//连接密码输入框
	private JPasswordField passwordField;

	public static void main(String[] args) {
		//EventQueue.invokeLater使事件派发线程上的可运行对象排队
		//当可运行对象排在事件派发队列的队首时，就调用其run方法
		//其效果是允许事件派发线程调用另一个线程中的任意一个代码块
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					//创建一个路灯连接界面
					Connect frame = new Connect();
					//显示连接界面
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	//CatLogin类继承自JFrame类，使用CatLogin类的构造函数，创建并设计登录界面
	public Connect() {
		//界面的标题
		setTitle("路灯连接界面\n");
		//用户单击窗口的关闭按钮时程序执行的操作----->退出界面
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		//设置窗口位置和大小
		setBounds(730, 360, 450, 300);
		//创建一个面板
		contentPane = new JPanel() {
			private static final long serialVersionUID = 1L;
			//设置面板的背景图片
			@Override
			protected void paintComponent(Graphics g) {
				super.paintComponent(g);
				g.drawImage(new ImageIcon("images\\背景.jpg").getImage(),
						0,0, getWidth(), getHeight(), null);
			}
		};
		//面板的边框设置
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		//将该面板设置为窗口的最外层容器
		setContentPane(contentPane);
		//面板无布局
		contentPane.setLayout(null);
		
		//输入路灯id提示信息
		JTextPane textpane_Id = new JTextPane();
		//设置为不可编辑状态
		textpane_Id.setEditable(false); 
		//设置文本框内容字体
		textpane_Id.setFont(new Font("微软雅黑", Font.BOLD, 25));
		//设置位置和大小
		textpane_Id.setBounds(86, 53, 100, 40);
		//设置为透明
		textpane_Id.setOpaque(false);
		//提示信息内容
		textpane_Id.setText("路灯id:");
		//加入最外层容器
		contentPane.add(textpane_Id);
		
		
		//JTextField是一个轻量级组件，允许编辑单行文本
		//“路灯id”输入框
		textField = new JTextField();
		//setBounds(int left, int top, int right, int bottom)移动组件并调整其大小
		//由left和top指定左上角的新位置
		//由width和height指定组件的大小
		textField.setBounds(174, 58, 140, 30);
		//设置输入字体
		textField.setFont(new Font("微软雅黑", Font.BOLD, 25));
		//setOpaque(true);//设置控件不透明
		//setOpaque(false);//设置控件透明
		textField.setOpaque(false);
		//向面板中添加该组件
		contentPane.add(textField);

		//密码输入提示信息
		JTextPane textpane_pwd = new JTextPane();
		//设置为不可编辑状态
		textpane_pwd.setEditable(false); 
		//设置文本框内容字体
		textpane_pwd.setFont(new Font("微软雅黑", Font.BOLD, 25));
		//设置位置和大小
		textpane_pwd.setBounds(60, 110, 120, 40);
		//设置为透明
		textpane_pwd.setOpaque(false);
		//设置提示信息
		textpane_pwd.setText("连接密码:");
		//加入最外层容器
		contentPane.add(textpane_pwd);
		
		//JPasswordField是一个轻量级组件，允许编辑单行文本，其中视图指示输入的内容，但不显示原始字符
		//“连接密码”框
		passwordField = new JPasswordField();
		//设置前景色，如文字颜色，密码颜色
		//passwordField.setBackground(Color.BLUE);设置背景颜色
		passwordField.setForeground(Color.BLACK);
		//设置密码替换字符
		passwordField.setEchoChar('*');
		//设置透明文本框
		passwordField.setOpaque(false);
		//设置组件位置及大小
		passwordField.setBounds(174, 115, 140, 30);
		passwordField.setFont(new Font("微软雅黑", Font.BOLD, 25));
		//向面板中添加该组件
		contentPane.add(passwordField);

		//创建“连接按钮”
		final JButton btnNewButton = new JButton("连接");
		//字体设置
		btnNewButton.setFont(new Font("微软雅黑", Font.BOLD, 18));
		//位置及大小设置
		btnNewButton.setBounds(206, 180, 70, 32);
		//背景为白色背景图片
		btnNewButton.setIcon(new ImageIcon("images\\白色.png"));
		//文字为黑色
		btnNewButton.setForeground(Color.BLACK);
		//显示文字
		btnNewButton.setHorizontalTextPosition(SwingConstants.CENTER);
		//将btnNewButton按钮设置为默认按钮，按回车相当于点击btnNewButton按钮
		getRootPane().setDefaultButton(btnNewButton);
		//将该按钮添加入容器中
		contentPane.add(btnNewButton);
		
		//创建“注册设备”按钮
		final JButton btnNewButton2 = new JButton("注册设备");
		//字体设置
		btnNewButton2.setFont(new Font("微软雅黑", Font.BOLD, 18));
		//位置及大小设置
		btnNewButton2.setBounds(296, 180, 110, 30);
		//背景为白色背景图片
		btnNewButton2.setIcon(new ImageIcon("images\\白色.png"));
		//文字为黑色
		btnNewButton2.setForeground(Color.BLACK);
		//显示文字
		btnNewButton2.setHorizontalTextPosition(SwingConstants.CENTER);
		//将该按钮添加入容器中
		contentPane.add(btnNewButton2);
		
		//提示信息
		//JLabel()创建无图像并且其文本为空字符串的 JLabel
		final JLabel lblNewLabel = new JLabel();
		//设置位置和大小
		lblNewLabel.setBounds(10, 185, 200, 21);
		//设置提示信息字体
		lblNewLabel.setFont(new Font("微软雅黑", Font.BOLD, 18));
		//设置提示信息的颜色
		lblNewLabel.setForeground(Color.red);
		//加入最外层容器
		contentPane.add(lblNewLabel);

		//监听"连接"按钮
		//给btnNewButton注册侦听器侦听事件
		btnNewButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				//实例化一个Properties属性对象
				Properties userPro = new Properties();
				//将文件名为设定输入流的源文件
				File file = new File("Users.properties");
				//将"Users.properties"文件加载到属性对象中进行操作
				Util.loadPro(userPro, file);
				//获取id
				String lampId = textField.getText();
				//判断文件是否有内容，若无内容，代表未输入账号
				if (lampId.length() != 0) {
					//判断Properties配置文件中是否有该"键"，即判断该账号是否被注册
					if (userPro.containsKey(lampId)) {//被注册
						//获取输入的密码
						String pwd = new String(passwordField.getPassword());
						//根据账号获取注册时输入的密码，判断此时密码是否输入正确
						if (pwd.equals(userPro.getProperty(lampId))) {//密码输入正确
							try {
								//与服务器建立连接
								Socket client = new Socket("localhost", 8520);
								//将"连接"按钮设置为不可点击状态
								btnNewButton.setEnabled(false);
								//根据路灯id信息创建一个虚拟路灯界面
								Lamps frame = new Lamps(lampId,client);
								//显示聊天界面
								frame.setVisible(true);
								//隐藏掉登陆界面
								setVisible(false);
							} catch (UnknownHostException e1) {
								errorTip("与服务器连接中断，请重新连接!");
							} catch (IOException e1) {
								errorTip("与服务器连接中断，请重新连接!");
							}

						} else if(pwd.length()!=0){//密码输入有误
							//提示信息
							lblNewLabel.setText("您输入的连接密码有误！");
							passwordField.requestFocus();
						}else {
							//提示信息
							lblNewLabel.setText("连接密码不能为空！");
							passwordField.requestFocus();
						}
					} else {//未被注册
						lblNewLabel.setText("您输入id不存在！");
						//重置id框和密码框
						textField.setText("");
						passwordField.setText("");
						//将光标放在id输入框上
						textField.requestFocus();
					}
				} else {
					//如果i框内容为空，提示内容
					lblNewLabel.setText("id不能为空！");
					//重置id框和密码框
					textField.setText("");
					passwordField.setText("");
					//将光标放在id输入框上
					textField.requestFocus();
				}
			}
		});
		
		//监听"注册设备"按钮
		btnNewButton2.addActionListener(new ActionListener() {
			//点击时调用
			public void actionPerformed(ActionEvent e) {
				//将"注册设备"按钮设置为不可点击状态
				btnNewButton2.setEnabled(false);
				//创建"注册设备"界面
				Resign frame = new Resign();
				//显示注册设备界面
				frame.setVisible(true);
				//隐藏掉连接界面
				setVisible(false);
			}
		});
	}
	
	protected void errorTip(String str) {
		//弹出框样式
		JOptionPane.showMessageDialog(contentPane, str, "Error Message",
				JOptionPane.ERROR_MESSAGE);
		//重置输入框内容
		textField.setText("");
		passwordField.setText("");
		//输入id框获得焦点
		textField.requestFocus();
	}
}